package com.aspire.main;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * .tryLock()使用测试
 * 注:无论线程是否抢占到了Lock实例的锁,都会立即返回一个结果
 *
 * @author JustryDeng
 * @DATE 2018年9月4日 上午11:20:17
 */
public class TryLockNoParamTest {

	/**
	 * 多线程测试方法
	 * 注:多个线程同时调用此方法(即:抢占此资源)
	 *
	 * @DATE 2018年9月4日 下午2:18:49
	 */
	static void multiThreadTest(Thread thread) {
		String threadName = thread.getName();
		for (int i = 0; i < 10; i++) {
			System.out.println(threadName + "进入for循环,此次i为:" + i);
		}
		System.out.println(threadName + "执行完毕!");
	}
	
	/**
	 * 程序入口
	 *
	 * @DATE 2018年9月4日 下午2:28:40
	 */
	public static void main(String[] args) {
		
		Lock lock = new ReentrantLock();
		// 匿名内部类,开启第一个线程
		new Thread("线程One") {
			public void run() {
				// 需要获取到lock的锁才能进入if条件成立对应的代码
				if(lock.tryLock()) {
					System.out.println(Thread.currentThread().getName() 
							              + "中的.tryLock()抢占到了锁,立即返回true;进入if条件成立逻辑");
					try {
						// 竞争multiThreadTest()资源
						multiThreadTest(Thread.currentThread());
					} catch (Exception e) {
					}finally {
						lock.unlock();
					}
				}else {
					System.out.println(Thread.currentThread().getName() 
							              + "中的.tryLock()没抢占到锁,不作等待,立即返回false");
				}
			};
		}.start();
		// 匿名内部类,开启第二个线程
		new Thread("线程Two") {
			public void run() {
				// 需要获取到lock的锁才能进入if条件成立对应的代码
				if(lock.tryLock()) {
					System.out.println(Thread.currentThread().getName() 
							              + "中的.tryLock()抢占到了锁,立即返回true;进入if条件成立逻辑");
					try {
						// 竞争multiThreadTest()资源
						multiThreadTest(Thread.currentThread());
					} catch (Exception e) {
					}finally {
						lock.unlock();
					}
				}else {
					System.out.println(Thread.currentThread().getName() 
							              + "中的.tryLock()没抢占到锁,不作等待,立即返回false");
				}
			};
		}.start();
	}

}
